perm filename GILFOC.SAI[SYS,HE] blob
sn#004270 filedate 1972-08-25 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 BEGIN "GILFOC"
00004 00003 PROCEDURE FOCDRAW(REAL EST_RANG,RANGINVAL INTEGER NCUT)
00006 00004 PROCEDURE TVSCREEN(REFERENCE INTEGER MAXGRADL,AV)
00009 00005 ⊃ MAIN BODY OF FOCDRAW
00013 00006 IF DIS_FOC THEN BEGIN
00016 00007 MESSAGE PROCEDURE AUTOFOC( REAL EST_RANG,RANGINVAL INTEGER NCUT)
00017 ENDMK
⊗;
BEGIN "GILFOC"
DEFINE ⊃ ="COMMENT";
REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
REQUIRE "HELIB[1,3]" LIBRARY;
EXTERNAL INTEGER PROCEDURE GIOWD(INTEGER ARRAY X);
EXTERNAL PROCEDURE INTPNT;
EXTERNAL INTEGER CUT,TVWORD;
INTEGER ARRAY DPYBUF[1:400],TVBUF[1:100],HIST[0:15];
INTEGER DUMMY,EXFLAG,MESS,MAXI,MINI;
DEFINE CRLF="&'15&'12", YES="INCHWL=""Y""", ⊃="COMMENT";
DEFINE WINDOW="X←0 STEP 1 UNTIL LOOK_AT[4]-1 DO
FOR Y←0 STEP 1 UNTIL LOOK_AT[5]-1";
DEFINE SWINDOW="X←1 STEP 1 UNTIL LOOK_AT[4]-2 DO
FOR Y←1 STEP 1 UNTIL LOOK_AT[5]-2";
REQUIRE "TVSER.SAI[SYS,HE]" SOURCE_FILE;
PROCEDURE FOCDRAW(REAL EST_RANG,RANGINVAL; INTEGER NCUT);
BEGIN "FOCDRAW"
⊃ EST_RANG-the initial estimated range to the feature (inches).
RANGEINVAL-the initial uncertainty of the range (inches).
NCUT-required value of CUT. use .7*MAXGRADG if NCUT=-1;
INTEGER MAXGRADG,J,I,N,FINEFOC,FOCSTRAT;
REAL X,XMAX,XMIN,XDELTA,YMULT,XMULT,RANG,DOFREQ,SINVAL,DELF;
LABEL BOUNDIN,XIT;
INTEGER ARRAY MAGAV,MAXGRAD[0:10];
REAL ARRAY DIST[0:10],PEAKMAG[1:3,1:2];
⊃ RANG-current estimate of range to feature.
DELF-current estimate of uncertainty of range.
DOFREQ-minimum attainable uncertainty of range.
SINVAL-current search interval.
MAXGRAD-max. abs. gradient at highest point of focus curve.
FINEFOC-number of improvement cycles (max.. 3 are allowed)
FOCSTRAT-set by ACOM_EVAL: 0-no contrast, 1-off center range,
2-uncertainty improved, 3-no improvement.
PEAKMAG-retains magnitude and range OF 3 highest points on
focus curve. used by ACOM_EVAL to judge accomodation.
;
PROCEDURE TVSCREEN(REFERENCE INTEGER MAXGRADL,AV);
⊃ reads 4 TV frames. returns the average intensity;
BEGIN "TVSCREEN"
REQUIRE "OP1.REL[SYS,HE]" LOAD_MODULE;
EXTERNAL PROCEDURE OP1;
EXTERNAL INTEGER PROCEDURE GETPNT (INTEGER X,Y);
EXTERNAL PROCEDURE AVERAG;
EXTERNAL INTEGER MAGSUM,NUMBR,TMPBUF;
INTEGER ARRAY TEMBUF[1:250];
NUMBR←4; TMPBUF←GIOWD(TEMBUF); MAGSUM←0; AVERAG;
OP1;
AV ← MAGSUM;
BEGIN INTEGER X,Y,M;
MAXGRADL←0;
FOR SWINDOW DO
IF (M←GETPNT(X,Y))>MAXGRADL THEN MAXGRADL←M;
END;
END "TVSCREEN";
SIMPLE INTEGER PROCEDURE ACOM_EVAL;
BEGIN REAL DELTX;
IF PEAKMAG[1,1]=0 THEN BEGIN
OUTSTR("ACOM_EVAL: INSUFF CONTRAST IN THIS RANGE"CRLF); RETURN(0); END;
IF (ABS(PEAKMAG[1,2]-XMIN)≤2*XDELTA)∨(ABS(PEAKMAG[1,2]-XMAX)≤2*XDELTA)
THEN BEGIN OUTSTR("ACOM_EVAL: ORIGINAL RANGE WASN'T CENTERED"CRLF);
RANG←PEAKMAG[1,2]; RETURN(1); END;
IF PEAKMAG[2,1]<.9*PEAKMAG[1,1]
THEN DELTX←XDELTA
ELSE IF PEAKMAG[3,1]<.8*PEAKMAG[1,1]
THEN BEGIN DELTX←ABS(PEAKMAG[1,2]-PEAKMAG[2,2]);
RANG←(PEAKMAG[1,2]+PEAKMAG[2,2])/2; END
ELSE BEGIN REAL T1,T2;
IF (T1←ABS(PEAKMAG[1,2]-PEAKMAG[2,2]))>
(T2←ABS(PEAKMAG[1,2]-PEAKMAG[3,2]))
THEN BEGIN DELTX←T1;
RANG←(PEAKMAG[1,2]+PEAKMAG[2,2])/2; END
ELSE BEGIN DELTX←T2;
RANG←(PEAKMAG[1,2]+PEAKMAG[3,2])/2; END;
END;
IF DELTX<DELF/2 THEN BEGIN DELF←2*DELTX; RETURN(2); END ELSE RETURN(3);
END"ACOM_EVAL";
⊃ MAIN BODY OF FOCDRAW;
IF NCUT<0
THEN MAXGRADG←6
ELSE IF NCUT>15
THEN BEGIN OUTSTR("FOCDRAW: ILLEGAL CUT ("&CVS(NCUT)&")"CRLF);
EXFLAG←2; RETURN; END
ELSE CUT←NCUT;
DELF←RANGINVAL; RANG←EST_RANG; FOCSTRAT←FINEFOC←0;
BOUNDIN:
DOFREQ←(RANG↑2)/(400*CAMLENS↑2);
MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_FOCUS(RANG));
IF CAMFLG≠0 THEN BEGIN EXFLAG←3; RETURN; END;
SETCLIP; IF EXFLAG≠0 THEN RETURN;
IF NCUT<0 THEN CUT←.7*MAXGRADG;
SINVAL←DELF; IF SINVAL<3*DOFREQ THEN SINVAL←3*DOFREQ;
X←XMIN←CAMRANG-SINVAL/2; XMAX←XMIN+SINVAL;
XDELTA←SINVAL/(N←10);
OUTSTR("FOCDRAW: FOCUS CURVE BEING COMPILED WITH CUT="&CVS(CUT)CRLF);
OUTSTR(" SINVAL="&CVG(SINVAL)&" RANG="&CVG(RANG)&
" DELF="&CVG(DELF)&" DOFREQ="&CVG(DOFREQ)CRLF);
MAGAV[0]←PEAKMAG[1,1]←PEAKMAG[2,1]←PEAKMAG[3,1]←0;
FOR I←1 STEP 1 UNTIL N DO BEGIN
MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_FOCUS(X));
IF CAMFLG≠0 THEN BEGIN EXFLAG←3; RETURN; END;
DIST[I]←CAMRANG;
INPUT; IF EXFLAG≠0 THEN RETURN; ⊃ Very important!;
TVSCREEN(MAXGRAD[I],MAGAV[I]);
IF MAGAV[I]>MAGAV[0] THEN MAXGRADG←MAXGRAD[I];
IF MAGAV[I]>PEAKMAG[3,1]
THEN IF MAGAV[I]>PEAKMAG[2,1]
THEN IF MAGAV[I]>PEAKMAG[1,1]
THEN BEGIN INTEGER Z;
FOR Z←3 STEP -1 UNTIL 2 DO BEGIN
PEAKMAG[Z,1]←PEAKMAG[Z-1,1];
PEAKMAG[Z,2]←PEAKMAG[Z-1,2]; END;
PEAKMAG[1,1]←MAGAV[0]←MAGAV[I];
PEAKMAG[1,2]←RANG←CAMRANG; END
ELSE BEGIN PEAKMAG[3,1]←PEAKMAG[2,1];
PEAKMAG[3,2]←PEAKMAG[2,2];
PEAKMAG[2,1]←MAGAV[I]; PEAKMAG[2,2]←CAMRANG;
END
ELSE BEGIN PEAKMAG[3,1]←MAGAV[I]; PEAKMAG[3,2]←CAMRANG; END;
IF I>1 THEN BEGIN
FOR J←I-1 STEP -1 UNTIL 1 DO
IF DIST[J]>DIST[J+1]
THEN BEGIN DIST[J]↔DIST[J+1]; MAGAV[J]↔MAGAV[J+1];
MAXGRAD[J]↔MAXGRAD[J+1]; END
ELSE DONE; END;
X←X+XDELTA; END;
IF DIS_FOC THEN BEGIN
DPYSET(DPYBUF); DPYTYP(-200,10,1);
⊃ lables the table;
AIVECT(-511,360); DPYSST(" MAGAV MAXGRAD X ");
⊃ displays table and vertical scale lines;
FOR I←1 STEP 1 UNTIL N DO BEGIN
AIVECT(-511,360-I*40);
DPYSST(CVS(MAGAV[I])&CVS(MAXGRAD[I])&" "&CVF(DIST[I]));
AIVECT(-210,380-I*40); RVECT(20,0); END;
⊃ compute the plotting scales;
XMULT←600.0/MAGAV[0]; YMULT←360.0/(DIST[10]-DIST[1]);
⊃ plots the axes;
AIVECT(-200,380); RVECT(0,-440); RVECT(660,0);
⊃ marks the criterion axis;
FOR I←0 STEP 1 UNTIL 10 DO BEGIN
AIVECT(-200+I*60,-50); RVECT(0,-20); RIVECT(-70,-30);
DPYSST(CVS(I*10)&"%"); END;
⊃ inserts highest value and MAXGRADG;
AIVECT(340,-150); DPYSST(CVS(MAGAV[0]));
AIVECT(150,-150); DPYSST("MAXGRADG="&CVS(MAXGRADG));
⊃ plots the criterion;
AIVECT(MAGAV[1]*XMULT-200,340);
FOR I←2 STEP 1 UNTIL N DO
RVECT((MAGAV[I]-MAGAV[I-1])*XMULT,-(DIST[I]-DIST[I-1])*YMULT);
DPYOUT(1); END;
FOCSTRAT←ACOM_EVAL;
IF FOCSTRAT=0 THEN BEGIN EXFLAG←4; RETURN; END;
IF FOCSTRAT=1 THEN GO TO BOUNDIN ELSE
IF FINEFOC=2 THEN GO TO XIT;
IF FOCSTRAT=2 THEN
IF DELF>DOFREQ THEN
BEGIN FINEFOC←FINEFOC+1; GO TO BOUNDIN; END
ELSE GO TO XIT;
XIT: MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_FOCUS(RANG));
IF CAMFLG≠0 THEN BEGIN EXFLAG←2; RETURN; END;
OUTSTR("FOCDRAW: RANG="&CVF(PEAKMAG[1,2])&
", DELF="&CVF(DELF)CRLF);
OUTSTR("FOCDRAW: FOCSTRAT="&CVS(FOCSTRAT)&
" FINEFOC="&CVS(FINEFOC)CRLF);
FOCRANG←RANG; FOCDELF←DELF;
END "FOCDRAW";
MESSAGE PROCEDURE AUTOFOC( REAL EST_RANG,RANGINVAL; INTEGER NCUT);
BEGIN EXFLAG←0;
FOCDRAW(EST_RANG,RANGINVAL,NCUT);
FOCFLG←EXFLAG;
END"AUTOFOC";
⊃ Main program;
TVWORD←GIOWD(TVBUF); INTPNT;
DIS_FOC←TRUE; DEB_FOC←FALSE;
SETFORMAT(6,3);
PUT_DATA(0,0,"FOC"); ⊃ DECLARE YOUR NAME ;
OUTSTR("FOC-ACTIVATED"CRLF);
YES_FOC←TRUE ;
WHILE TRUE DO BEGIN
MESS ← GET_ENTRY ('120,NULL,"FOC",NULL);
MESS ← QUEUE ('600,MESS); ⊃ ACTIVATE AND ACKNOWLEDGE ;
END;
END "GILFOC";